const moment = require("moment");
const utils = require('../../util/utils');
const roleDao = require('../../dao/admin/roleDao');

var RoleService = module.exports;

var genError = function (errCode, message) {
    var error = new Error(message);
    error.errCode = errCode;
    return error;
};

/**
 * 加载角色
 * @param role_id
 * @returns {Promise<*>}
 */
RoleService.getMenus = async function(role_id) {
    return roleDao.getMenus(role_id);
};

/**
 * 加载角色列表
 * @param cb
 */
RoleService.getAllRoles = function(cb) {
    roleDao.getAllRoles().then(data => {
        if (!data) {
            return utils.invokeCallback(cb, {error: 1, msg: '内部错误'});
        } else {
            return utils.invokeCallback(cb, null, data);
        }
    }).catch( err => {
        console.log('Unable to connect to the database:'+err.stack);
        return utils.invokeCallback(cb, {error: 1, msg: '内部错误'});
    });
};

/**
 * 加载角色列表
 * @param keywords
 * @param start
 * @param length
 * @param cb
 */
RoleService.getRoles = function (keywords, start, length, cb) {
    roleDao.getRoles(keywords, start, length).then(data => {
        if (!data) {
            return utils.invokeCallback(cb, {error: 1, msg: '内部错误'});
        } else {
            return utils.invokeCallback(cb, null, data);
        }
    }).catch( err => {
        console.log('Unable to connect to the database:'+err.stack);
        return utils.invokeCallback(cb, {error: 1, msg: '内部错误'});
    });
};

/**
 * 角色更新
 * @param roleInfo
 * @param cb
 */
RoleService.createRole = function(roleInfo, cb){
    const rolename = roleInfo.role_name;
    roleDao.getRoleByName(rolename).then(role => {
        if (role) {
            throw genError(1, '角色名已经存在')
        }

        roleDao.createRole(roleInfo).then(result => {

            utils.invokeCallback(cb, null, result);

        }).catch(function (err) {

            console.log('Unable to connect to the database:'+err.stack);
            utils.invokeCallback(cb, err, null);
        });
    }).catch(err => {

        console.log('Unable to connect to the database:'+err.stack);
        utils.invokeCallback(cb, err, null);
    });
};

/**
 * 更新角色信息
 * @param roleInfo
 * @param cb
 */
RoleService.updateRole = function(roleInfo, cb){
    const roleId = roleInfo.role_id;
    const rolename = roleInfo.role_name;
    roleDao.getRoleById(roleId).then(async role => {
        if (!role) {
            throw genError(1, '角色不存在');
        }

        var existdRole = await roleDao.getRoleByName(rolename);
        if (existdRole && existdRole.role_id !== role.role_id) {
            throw genError(1, '角色名已存在');
        }

        roleDao.updateRole(roleInfo).then(result => {

            utils.invokeCallback(cb, null, result);

        }).catch(function (err) {

            console.log('Unable to connect to the database:'+err.stack);
            utils.invokeCallback(cb, err, null);
        });
    }).catch(err => {

        console.log('Unable to connect to the database:'+err.stack);
        utils.invokeCallback(cb, err, null);
    });
};

/**
 * 删除角色
 * @param ids
 * @param cb
 */
RoleService.destroyRoles = function (ids, cb) {
    roleDao.destroyRoles(ids).then(result => {
        return utils.invokeCallback(cb, null, result);
    }).catch(err => {
        console.log('Unable to connect to the database:'+err.stack);
        return utils.invokeCallback(cb, {error: 1, msg: '删除失败，请联系管理员'});
    });
};

/**
 * 设置菜单
 * @param role_id
 * @param menu_ids
 * @param cb
 */
RoleService.setMenus = function (role_id, menu_ids, cb) {
    roleDao.setMenus(role_id, menu_ids).then(result => {
        return utils.invokeCallback(cb, null, result);
    }).catch(err => {
        console.log('Unable to connect to the database:'+err.stack);
        return utils.invokeCallback(cb, {error: 1, msg: '设置菜单失败，请联系管理员'});
    });
};

